package bancosys.tec.persist.validator;

import bancosys.tec.exception.LocalizedMessageHolder;
import bancosys.tec.exception.MessageHolder;
import bancosys.tec.persist.Persistable;

/**
 * @created Feb 6, 2007
 * @author Gustavo Almeida
 */
public class ValidationError {

    private static final String BUNDLE_NAME = "jmine-tec-persist-messages";

    private LocalizedMessageHolder messageHolder;

    private String attribute;

    private Persistable bean;

    /**
     * Construtor
     * 
     * @param key key
     * @param arguments arguments
     * @deprecated use LocalizedMessageHolder
     */
    @Deprecated
    public ValidationError(final String key, final Object... arguments) {
        this(new MessageHolder(BUNDLE_NAME, key, arguments));
    }

    /**
     * Construtor
     * 
     * @param messageHolder messageHolder
     */
    public ValidationError(final LocalizedMessageHolder messageHolder) {
        this.messageHolder = messageHolder;
    }

    /**
     * Construtor.
     * 
     * @param key chave de erro.
     * @param bean bean que não passou na validação.
     * @param arguments argumentos da mensagem
     * @deprecated use LocalizedMessageHolder
     */
    @Deprecated
    public ValidationError(String key, Persistable bean, Object... arguments) {
        this(null, key, bean, arguments);
    }

    /**
     * Construtor.
     * 
     * @param key chave de erro.
     * @param bean bean que não passou na validação.
     * @param attribute atributo que causou a falha na validação.
     * @param arguments argumentos da mensagem
     * @deprecated use LocalizedMessageHolder
     */
    @Deprecated
    public ValidationError(String attribute, String key, Persistable bean, Object... arguments) {
        this(key, arguments);
        this.bean = bean;
        this.attribute = attribute;
    }

    /**
     * Construtor
     * 
     * @param messageHolder messageHolder
     * @param bean bean.
     */
    public ValidationError(LocalizedMessageHolder messageHolder, Persistable bean) {
        this(messageHolder);
        this.bean = bean;
    }

    /**
     * Construtor
     * 
     * @param messageHolder messageHolder
     * @param bean bean.
     * @param attribute attribute.
     */
    public ValidationError(LocalizedMessageHolder messageHolder, String attribute, Persistable bean) {
        this(messageHolder);
        this.bean = bean;
        this.attribute = attribute;
    }

    /**
     * Devolve o atributo do bean que deu erro na validação.
     * 
     * @return o atributo do bean que deu erro na validação, pode vir <code>null</code> quando a validação não atua sibre um atributo em
     * particular.
     */
    public String getAttribute() {
        return this.attribute;
    }

    /**
     * Devolve o bean (não) validado.
     * 
     * @return o bean.
     */
    public Persistable getBean() {
        return this.bean;
    }

    /**
     * @return LocalizedMessageHolder
     */
    public LocalizedMessageHolder getLocalizedMessageHolder() {
        return this.messageHolder;
    }

    /**
     * Retorna a mensagem convertida no default locale. Caso não seja possível, devolve a chave.
     * 
     * @return A mensagem ou a chave.
     */
    public String getMessage() {
        return this.getLocalizedMessageHolder().getMessage();
    }
}
